                     Release Note for BCM5702 BOOT Code Firmware
                    =================================================

Version 2.39: 

  1. Writes firmware id to shared memory rx_cpu_firmware_id field
  
    Enhancement:
      Phase1 & Phase2 code will write the firmware id to rx_cpu_firmware_id.
      
    Eng. Notes:
      bootcode phase1 will write value 0xfefe0008 to shared memory 0xc0c.
      bootcode phase2 will write value 0xfefe0009 to shared memory 0xc0c.
      When phase2 executes properly, the value phase1 wrote should be
      overwritten by phase2 code.  
      
Version 2.38:
          
  1. Restored phy type in manufacture data block
  
    Problem: 
      PXE code needed this field to determine the phy type
    
    Fix: 
      Hard coded this field to be copper type
   
  2. Changed device id from 0x16a6 to 0x16c6
  
    Problem:
      Device id has been changed from chip rev. A3 or later.
    
    Fix:
      Changed the default device id to rev A3 or later.                  
              
Version 2.37: 

  1. Fixed WOL issue
    
    Problem: 
      After using restart option in Windows and restart computer to DOS. 
      Then, turn off the power, WOL will not work.

    Cause:   
      Since there was no power lose from Windows to DOS, the signature 
      deposited by driver was not cleared. Therefore, when power lose from 
      DOS, bootcode sees the WOL signature and was bypassing the WoL 
      initialization.
      
    Fix:     
      Changed bootcode to clear WoL signature if the startup does not have 
      driver signature.
      
Version 2.36: 

  1. Get phy id from phy register instead of NVRAM configuration

    Enhancement: 
      Get phy id from phy register instead of NVRAM configuration

    Cause:
      Originally, the phy id field in shared memory was read from NVRAM
      configuration. User could changed it any way they wanted and
      driver cannot rely on the content to perform as correct judgements

    Change:
      The phy id in shared memory will be read from phy register instead
      of NVRAM field.

  2. Removed Phy 1.8v option
  
    Problem:
      Earlier bootcode contains 5701 product code which will
      cause a glitch in the PHY clock and could cause PHY to lock-up. 
      
    Cause:
      The code was carry over from 5701 in the old day was not needed
      in newer product.
    
    Fix: 
      Removed unnecessary code that could cause Phy to lock-up.
      
Version 2.35:

  1. Fixed Link drop problem in version 2.34
  
    Problem: 
      Link will drop in middle of Windows Certification test

    Cause:   
      In version 2.34, the device reset indication bit was not passed 
      from phase 1 to phase 2 correctly. As result, the bootcode was 
      performing phy reset from driver reset.
      
    Fix:     
      Fixed the software bug. 
      
    Note: This bug was introduced in version 2.34

Version 2.34:

  1. Enable phy in cold reset.

    Problem: 
      Cannot access MAC register if phy is in powerdown state. 
      
    Cause:   
      When Windows is restarting, the driver go through the shutdown 
      routine. When WoL is disabled, it turns off phy completely by 
      putting phy to powerdown mode. When it restarts, the main power,
      3.3 volt is stable. Only rely on PCI reset, the device does not
      generating power on reset; thus phy is not reset and still in
      powerdown state. To access MAC registers, phy clock is required
      and we need to access the register for MAC address initialization.
      
    Fix:     
      If it is cold reset, it will put phy to 10mbps to enable the clock
      before accessing MAC registers. This also helps to reduce power 
      consumption by putting at lowest speed. The phy will eventually get
      reset at phase 2 code.
      
    Note: This is an extension fix of version 2.25 item 17. 
             
Version 2.33: 

  1. Fixed PXE ROM size bug
    
    Problem: 
      The secfg option 29, expansion ROM size was not taking effect.
      The size was always 64k. 
      
    Cause:   
      Bootcode did not program the correct value in the register.
      
    Fix:
      Bootcode is changed to program correct expansion ROM size setting 
      in NVRAM configuration into register.

Version 2.32:

  1. Fixed configuration read bug.

    Problem: The 2nd phase code was not reading configuration correctly
    Cause:   software bug.
    Fix:     Corrected the bug.
    Note:    This bug was created in version 2.31.

Version 2.31:

  1. Supports Shared Memory data structure version 1

    Problem: Driver need more information from bootcode.
    Cause:   More feature is needed to support in driver.
    Fix:     Changed the shared data structure from version 0 to version 1
             to pass new data in new fields.

  2. Removed phase 2 image loading failure LED blink feature (to save space)

    Problem: 
      Image size is growing to 8k limit. We needed to remove the Debug 
      feature out to save space.
      
    Effects: 
      If first phase bootcode has failed to load second phase code, the older 
      code will blink both traffic and link LED. This version will no longer 
      blink the LED.

Version 2.30: 

  1. Support Reverse Nway PowerSaving 

    Problem: 
      Needed new Reverse Nway feature.
      
    Cause:   
      When Reverse Nway mode is on, bootcode needed to settle at lowest speed 
      possible to save power.
      
    Fix:     
      When feature is enabled, put to 10mbps speed.

  2. Fixed Rev. A2 Tx Scratchpad code loading problem.

    Problem: 
      In OOB, the device could not establish LINK when ASF is enabled
      
    Cause:   
      For rev A2 or earlier, Tx Scratchpad was disabled and not accessible in 
      OOB mode. When ASF is enabled, the bootcode would load ASF code into TX 
      CPU and cause CPU to hang
      
    Fix:     
      Put a sanity check on scratchpad accessiblity. If passes, then it will 
      proceed with code loadding. 

  3. Changed phy type always to be copper
  
    Problem: 
      User could change phy type in NVRAM configuration to serdes and 
      cause the bootcode to misbehave
             
    Cause:   
      Originally, the bootcode was shared between copper and Serdes 
      verion; therefore, we needed a configuration field to indicate if 
      this is copper or serdes. Today, we separated the bootcode image 
      already, we don't need to use this configuration any more.
              
    Fix:
      Instead of reading phy type from configuration, it now will always 
      force this field to be copper type. 

Version 2.29:

  1. Support WoL Limit 10 speed

    Problem: WoL was always 10/100
    Cause:   We didn't have configuration to allow user to limit the link
             speed to 10.
    Fix:     Added new configuration WoL Limit 10 for this purpose.
             This version of bootcode will read the configuration and set
             the speed accordingly.               

  2. Added 2nd phase signature.

    Problem: Driver/Diagnostics could not tell when the 2nd phase bootcode
             initialization is complete.
    Cause:   We only had 1st phase signature but we didn't have 2nd phase
             signature.
    Fix:     Added 2nd phase signature.

Version 2.28:

  1. Improved NVRAM corruption workaround algorithm
    
    Problem: The problem described in 2.23 item 2 still exist.
             Theologically, there is potential problem when PC jumps
             to NVRAM write routine with invalid register content 
             when losing power.
    Fix:     Enhance the original workaround by not only check of VPD
             write event, but also construct the command outside of
             VPD event 'if' check. Thus, if PC happens to be jumping
             outside of 'if' statement, it is protected by VPD write
             event. If the PC happens to jump inside of if statement,
             it will write harmless command since the command is not
             constructed yet.       
             Also, when power is deteriorating, most likely the address
             jump will incorrectly jump from high to low address. 
             Therefore, moved the NVRAM write routine to the highest 
             address in the module.       

Version 2.27:

  1. Reversed the NVRAM corruption workaround algorithm to original method

    Problem: The new workaround method does not work with other firmware
    Cause:   Other firmware, such as ASF or TCP segmentation firmware
             does not reserve the special register content. Thus, the
             workaround does not work if other firmware is loaded.
    Fix:     Reversed back to original method. With double check of NVRAM
             write only if VPD event bit is present.

Version 2.26:

  1. Use default MAC address for entry 1 to 15

    Problem: After we programmed all same MAC address in MAC registers
             in version 2.22 item 14, we started to fail Microsoft
             certification test. 
    Cause:   The certification test was testing if we program zero MAC
             address into our MAC address register and make sure we will
             not accept the packet address to our device; however, even if
             our MAC register 0 has been programmed with 0, since MAC
             register 1 to 15 still have our MAC address, it was continuing
             to receive the packet address to our MAC address.
    Fix:     Initialize all Mac address registers 1-15 with broadcom default
             MAC address 001018000000. 

  2. Changed NVRAM corruption workaround algorithm

    Problem: Theologically, there is potential problem when PC jumps
             to NVRAM write routine with invalid register content 
             when losing power.
    Cause:   When the device is losing power, the power drains down
             slowly. In the mean time, internal CPU is still running
             with deteriorating logic value. Under this condition, PC
             can jump in invalid NVRAM write routine and issue write
             command to NVRAM and cause the NVRAM corruption.
    Fix:     Reserved one CPU General Purpose Register to be used for
             command to write NVRAM. If any jumps should occur, it will
             write an harmless command into NVRAM command register.          

Version 2.25:

  1. Propagated the ASF enable information to shared memory before 
    signature

    Problem: Driver was getting incorrect ASF enable status.
    Cause:   ASF enable bit was initialized in shared memory after the 
             signature 
    Fix:     Propapated the ASF enable information to shared memory before 
             signature
    Note:    This is also propagated in version 2.21b

  2. Fixed a bug where bootcode may fail to cut auxiliary power 
    when WOL is disabled.
     
    Problem: Some times, the NIC will not cut auxiliary power even WoL is
             disabled.
    Cause:   In the phase 1 code, the WoL indication variable was not
             initialized when checking for necessity of cutting VAUX power.
    Fix:     This is pure software bug. The variable now is initialized
             currectly before use.
    Note:    This bug is also fixed in version 2.21c              
     
  3. Propagated NVRAM setting regarding WOL even on device reset.
  
    Problem: NVRAM setting was not propagated to shared memory on
             device reset.
    Fix:     Propagate NVRAM setting regarding WOL even on device reset
    Note:    This is also propagated in version 2.21c
     
  4. Fix WOL when power down from PXE or DOS driver
  
    Problem: When PXE is enabled and BIOS is loading ROM code, if the power
             is turned off, WoL will not work.
    Cause:   When PXE code is running, it resets the firmware with driver 
             signature. When bootcode sees the signature, it will not enable
             WoL.
    Fix:     The fix is to check if driver set up any WOL before unloading 
             itself. If it is set (magic or interesting or both), the firmware
             will not touch the WOL setup. If it is not set, it'll consult 
             wol setting in EEPROM. If WOL is specified to be "enabled" in 
             EEPROM, the firmware will set it up. This allows magic pkt WOL 
             after powering down from PXE or DOS driver. The drawback is that 
             the WOL setting in Windows registry cannot override the EEPROM 
             setting (i.e. if user disables WOL completely in Windows, the
             firmware will decide whether to set up WOL based on EEPROM 
             setting).
    Note:    This fix is also in version 2.21c 
    
  5. Fixed PXE speed Config. bug
  
    Problem: PXE speed setting was not taking effect.
    Cause:   The PXE speed was not programmed correctly
    Fix:     Program PXE speed according to secfg setting
    Note:    This is also fixed in version 2.21d
  
  6. Fixed an LED problem with A2 LOM when ASF is enabled.
  
    Problem: When ASF code was fail to load, we could not tell the failure
             from LED indicator. 
    Cause:   Original board design, we had all 10M, 100M, 1000M link speed
             LEDs. When it failed, all LED was turned on. With some board
             design, we only have one LED for link status. When turning on
             all link speed cannot tell from having good link connected. 
    Fix:     Turn on traffic also when it failed. Thus all LED will be
             turned when there is failure.
    Note:    Fix is also in version 2.21d
  
  7. Cut aux power when driver goes hibernation without WOL
  
    Problem: Vaux power was not cut off from Window hibernation without WOL
    Fix:     Cut the Vaux power when window hibernates.
    Note:    Fix is also in Version 2.21d
    
  8. Added power saving mode support.
  
    Problem: To support power saving mode. We needed to default the link
             speed to 10 mbps to conserve power.
    Fix:     Added new secfg configuration setting and set phy speed to
             10 mbps if this featuer is enabled.         
    Note:    This is also added in version 2.21d
  
  9. Added new WOL communication with driver
  
    Problem: Driver cannot take over the firmware setting to disable WoL.
             Bootcode was always taking over driver WoL setting.
    Cause:   The scheme implemented in item 4, (version 2.21c), had
             drawback that When driver wants to disable WoL, it was not
             able to do so if NVRAM WoL setting is set. There was no 
             communication between driver and firmware. Upon power down, 
             firmware was taking over control for WoL initialization.
    Fix:     Implemented a new WOL scheme that communicate with drivers. 
             For older driver version older than 07/17/02, if WoL is enabled
             by driver, firmware will not touch anything. For newer driver,
             it will post signature. And depends on the commands. Firmware
             will act accordingly. 
    Note:    This change is also added in version 2.21e         

  10. Added NVRAM corruption protection
  
    Problem: NVRAM corruption was seen
    Cause:   When powering off, the power drops down slowly. The CPU was
             still running under deteriorating illegal power and cause
             to jump to NVRAM write routine and caused NVRAM corruption.
    Fix:     The workaround was to put a VPD write event qualification
             before actual write command.
    Notes:   This is also added in version 2.21e               

  11. Changed Phase1/Phase2 parameter passing to void bootcode/driver 
    race condition

    Problem: Fixed PHY access contention problem with driver
    Cause:   Phase 2 code needed some information requires MII access; 
             however, since the signature has been posted by first phase,
             the driver already have the ownership of MII access. By reading
             MII register in 2nd phase code, caused firmware/driver MII read
             conflict.
    Fix:     The information need by 2nd phase was read in 1st phase and 
             passed the information to 2nd code via shared memory as 
             parameter passing.
    Note:    This is also fixed in version 2.21e

  12. Added Phase1 NVRAM access arbitration logic

    Problem: Phase 1 bootcode was not using arbitration logic accessing NVRAM
    Fix:     Added arbitration logic in NVRAM access.
    Note:    This is also fixed in verision 2.21e

  13. Fixed ASF configuration application misreading EEPROM content problem
  
    Problem: ASF configuration application read incorrect NVRAM content
    Cause:   ASF configuartion application (running under Windows) resets
             the device first and then start to read NVRAM content. Since
             the first phase code didn't have NVRAM arbitration logic, boot
             code was fighting the NVRAM access with application.
    Fix:     Added arbitration logic in phase 1 bootcode. (Same as Item 10)
    Note:    Fix is also in version 2.21e                          
    
  14. Fixed NULL MAC address problem 
  
    Problem: The device was accepting NULL MAC address packets. 
    Cause:   Only Mac Address register 0 was programmed. All other
             Mac was left was default value 0.
    Fixed:   Program all 16 MAC registers with the MacAddress in 
             NVRAM. 
             
  15. Improved PXE loading speed
  
    Problem: PXE was taking too much time to load and cause system hang
    Cause:   BIOS was reading PXE in byte. Each by access, we needed to
             Access NVRAM to return data.
    Fix:     Our ASIC design always read data in word (4 bytes) size. 
             For each ROM byte read it will be wasted of time to read 
             the entire 4 byte-word again. Changed algorithm to save the
             read data in memory, acting as cache. 

  16. Supports dynamic bootcode location 

    Problem: The bootcode had to be in fixed in address 0x200. When the 
             next application is programmed right after the bootcode 
             image, upgrading larger bootcode image requires bootcode to
             be allocated to another location.
    Cause:   We never needed dynamic bootcode allocation support until now
    Fix:     Added new algorithm to support dynamic bootcode allocation

  17. Fixed zero MAC address problem

    Problem: The NIC Device driver "sees" zero MAC address when user choose
             "system restart" under Windows.  This only occur when "system
             restart" and WoL is disabled. It does not occur in system 
             "cold start" (shutdown the system completely, then restart the 
             system by pushing the power switch).
    Cause:   The device is not able to access MAC Address register if PHY is 
             in shutdown mode. When the user choose the "restart" in a Windows
             system, the OS will perform (a) "shutdown" and then (b) "restart"
             the system. During the "shutdown" phase, the NIC Device Driver 
             checks to see if the WoL option is enabled or not.  If the WoL is 
             disabled, the device driver will program the PHY to powerdown 
             mode in order to reduce power consumption. When system restart, 
             PCI reset is asserted by system. The bootcode restart; however it
             does not reset the phy. Since the phy was in powerdown mode, and
             MAC registers requires phy clock to operate, the MAC Address 
             registers becomes inaccessible by the "bootcode".
    Fix:     The MAC address is programmed in SRAM first and let driver to
             program the MAC address in MAC address regiser after phy reset. 

Version 2.24a:
    1. Fixed intermittent chip CPU crashing in auxiliary power mode (CQ#3763).

Version 2.24:
    1. Propagate GPIO_1 usage to driver and corrected the usage
         in a VPD operation.
    2. Updated LED modes of operations.

Version 2.23:
    1. Exploited power state and pci power presence features supported 
       in A2.
    2. Included write protect of EEPROM for some LOM design.
    3. Increased the bootcode image size to 5kbytes (5120 bytes).
    4. Fixed pxe speed initialization (CQ#3488).
    5. Restored range check for VPD access.

Version 2.22:
    1. Support fastboot initiative.
    2. PXE and ASF no longer need to be mutually exclusive.
    3. Updated Ethernet@WireSpeed setup sequence.

Version 2.21:
    1. Added CRC checking before loading other firmware (e.g. ASF). 
       All speed LEDs will light up when CRC check fails.
    2. Added 5702FE and Ethernet@WireSpeed supports.
    3. Uses 0x16A6 as the new device ID in the boot image.

Version 2.19:
    1. Employed block read method when loading other firmwares (e.g. ASF)
       from non-volatile memory.
    2. Increased the bootcode image size to 4.5kbytes (4608 bytes). This 
       may have impact on boards that already have pxe or other firmware 
       programmed as they need to be reprogrammed.
    3. Added CRC checking before loading phase 2 bootcode. All speed LEDs 
       will light up when CRC check fails.
    4. Fixed a bug where a system cannot boot up if phase 2 bootcode is 
       corrupted.
    5. Fixed a bug where Windows does not wake up from standby due to 
       bootcode cutting off aux power.
    6. Eliminated flash interface reset as this may cause non-volatile 
       memory module to become out of sync.
   Note: PXE and ASF currently must be mutually exclusive. Enabling both
         may have an undesirable effect.

Version 2.18:
    1. Employed block read method when loading codes from non-volatile
         memory.

Version 2.17:
    1. Fixed a failure of loading PXE when WOL is enabled.

Version 2.16:
    1. Speed up the PXE loading (CQ#3108).
    2. Enable expansion ROM bit in phase one booting to avoid BIOS missing
       to load PXE when enabled.

Version 2.15: (A0 chip is no longer supported)
    1. Implemented two-phase loading to speed up the boot process.
    2. Firmware stops running after loading ASF to avoid interference.
    3. Cut off auxilary power when an OS turns off the device due to
       absence of driver.
    4. Use software arbitration support by the hardware when accessing 
       non-volatile memory.
    5. Included cold WOL support.
    6. Fixed a problem where the system fails to boot when both PXE and
       WOL are enabled (CQ#2977).
    7. Fixed a bug where the firmware did not clear VPD request after
       it is serviced.

Version 2.14:
    1. Moved multiple boot agent codes and fixed uninitialized variable bug.
    2. Updated default subsystem device ID.
    3. Temporarily remove cold WOL support to ensure proper bootcode execution.

Version 2.13:
    1. Added new GPIO sequences for WOL.
    2. Added cold WOL support.
    3. Embedded version string into the executable binary.
    4. Support multiple boot agents.
    5. Set LED to PHY mode when card first receives auxilary power.
    6. Enable PXE loading from flash memory.
    7. Disabled the setup for max PCI retry, default to zero.

Version 2.12:
    1. Added ASF support.
      
Version 2.11:
    1. Fixed Non-Buffer VPD write bug
                          
Version 2.10:
    1. Added flash write support for VPD. 
    2. Added auto negotiation for 5703S.
                    
Version 2.8:
    1. Branched bootcode into several versions to be silicon specific.
    2. Fixed flash timeout problem.

Version 2.7:
    1. Added 5703 support.

Version 2.6:
    1. Added generic loader support.  This is a requirement for ASF support.

Version 2.5:
    1. Fixed the cable unplug/replug problem on PCI-X setting.

Version 2.4:
    1. Fixed cable unplug/replug problem (CQ#1998).

Version 2.3:
    1. Added 100Mbps WOL on A3/B5 boards.
    2. Fixed zero mac address when enabling WOL on fiber card (CQ#2236).

Version 2.2:
    1. Initialize PME Status upon the first time power-up.

Version 2.1:
    1. Fixed bug on WOL.
    2. Temporarily disable BCM5703 support.
    3. Fixed link loss on fiber card.

Version 2.0:
    1. Added WOL support
    2. Added BCM5703 support

Version 1.9:
    1. Added features so that neccessary manufacturing information is 
       stored in the shared memory.  This allows host driver can query 
       these information.

Version 1.8:
    1. Fixed a problem where PXE is not operatable in version 1.7.

Version 1.7:
    1. Added logic for 1.3v and 1.8v voltage source.
      2. Added logic forcing PCI mode.

Version 1.6:
    1. Added BCM5701 support.  
        * Initialize BCM5701 to use PHY LED mode.
        * Initialize BCM5701's PHY to advertise 10/100/1000.
    2. Timer prescaler is now initialized to reflect 66Mhz core clock.

Version 1.5:
    1. Added BCM5700 Fiber support.  

Version 1.4:
    1. Initialize BAR after first reset.

Version 1.3:
    1. Changed so that default manufacturing information now has proper
         power consumption and dissipation.

Version 1.2:
    1. Fixed a problem where firmware has problem accessing PHY registers
       during bootup time for NIC rev.12 and above.

Version 1.1:
    1. Format of ASIC revision ID has been changed.  Changed to generate
       PCI revision ID correctly.  

          ASIC Rev.           PCI Revision ID
          ========            ===============
            B0                     0x10
            B1                     0x11

Version 1.0:
    1. Initialize PHY LED mode based on subsystem vendor ID.
        * Dell Viper LOM (0x1028)  : Triple speed mode (MII 0x10 = 0x0)
        * Other : link/speed mode (MII 0x10 = 0x2)

Version 0.8:
    1. Initialize PHY LED mode based on subsystem device ID.
          * Dell Viper LOM (0x1028)  : Triple speed mode (MII 0x10 = 0x2)
          * Other : link/speed mode (MII 0x10 = 0x0)

Version 0.7:
    1. Initialize PHY (BCM5401) with scripts so that NIC has link after 
         power-on-reset before driver is loaded.

Version 0.6:
    1. Initialize Chip Revision ID in PCI configuration space.

Version 0.5:
    1. Added logic to perform PHY H/W reset.
      2. Initialize VPD delay so that BIOS can access VPD.

Version 0.4:
    Initial release.

